package com.qs.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qs.constant.StatusConstant;
import com.qs.exception.ServiceException;
import com.qs.mapper.StoreMapper;
import com.qs.mapper.UserGoodsLogMapper;
import com.qs.pojo.dto.GoodsDto;
import com.qs.pojo.dto.StoreCollectDto;
import com.qs.pojo.entity.*;
import com.qs.mapper.CollectStoreMapper;
import com.qs.response.ResponseEnum;
import com.qs.service.ICollectStoreService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 * 用户收藏店铺表 服务实现类
 * </p>
 *
 * @author author
 * @since 2023-12-17
 */
@Service
@RequiredArgsConstructor
public class CollectStoreServiceImpl extends ServiceImpl<CollectStoreMapper, CollectStore> implements ICollectStoreService {

    private final StoreMapper storeMapper;

    private final UserGoodsLogMapper userGoodsLogMapper;

    @Override
    public void saveCollectStores(CollectStore collectStore) {
        if (collectStore != null){
            QueryWrapper<CollectStore> wrapper = new QueryWrapper<>();
            wrapper.eq("user_id",collectStore.getUserId());
            wrapper.eq("store_id",collectStore.getStoreId());
            CollectStore collectSuc = baseMapper.selectOne(wrapper);
            if(null != collectSuc){
                throw new ServiceException(ResponseEnum.COLLECT_STORE_SUCCESS);
            }
            baseMapper.insert(collectStore);
        }
    }

    @Override
    public Map<String, Object> getCollectStoresList(Integer pageNo, Integer pageSize, Integer userId) {
        if(null != userId){
            Page<CollectStore> pageInfo = new Page<>(pageNo, pageSize);
            QueryWrapper<CollectStore> wrapper = new QueryWrapper<>();
            wrapper.eq("user_id", userId);
            Page<CollectStore> collectStorePage = baseMapper.selectPage(pageInfo, wrapper);
            if(collectStorePage != null){
                List<CollectStore> collectStoreList = collectStorePage.getRecords();
                List<StoreCollectDto> list = new ArrayList<StoreCollectDto>(collectStoreList.size());
                if(!CollectionUtils.isEmpty(collectStoreList)){
                    collectStoreList.stream().forEach(collectStore -> {
                        Store store = storeMapper.selectById(collectStore.getStoreId());
                        StoreCollectDto storeCollectDto = new StoreCollectDto();
                        BeanUtils.copyProperties(store, storeCollectDto);
                        storeCollectDto.setStoreId(store.getId());
                        storeCollectDto.setId(collectStore.getId());
                        list.add(storeCollectDto);
                    });
                    Map<String,Object> map = new HashMap<String,Object>();
                    map.put("data",list);
                    map.put("total",collectStorePage.getTotal());
                    return map;
                }
                return null;
            }
            return null;
        }
        return null;
    }

    @Override
    public Map<String, Object> getPayedStoresList(Integer pageNo, Integer pageSize, Integer userId) {
        if(null != userId){
            Page<UserGoodsLog> pageInfo = new Page<>(pageNo, pageSize);
            QueryWrapper<UserGoodsLog> wrapper = new QueryWrapper<>();
            wrapper.eq("user_id", userId);
            wrapper.select("DISTINCT store_id");
            Page<UserGoodsLog> collectStorePage = userGoodsLogMapper.selectPage(pageInfo, wrapper);
            if(collectStorePage != null){
                List<UserGoodsLog> records = collectStorePage.getRecords();
                List<StoreCollectDto> list = new ArrayList<StoreCollectDto>(records.size());
                if(!CollectionUtils.isEmpty(records)){
                    records.stream().forEach(collectStore -> {
                        Store store = storeMapper.selectById(collectStore.getStoreId());
                        StoreCollectDto storeCollectDto = new StoreCollectDto();
                        BeanUtils.copyProperties(store, storeCollectDto);
                        storeCollectDto.setStoreId(store.getId());
                        storeCollectDto.setId(collectStore.getId());
                        list.add(storeCollectDto);
                    });
                    Map<String,Object> map = new HashMap<String,Object>();
                    map.put("data",list);
                    map.put("total",collectStorePage.getTotal());
                    return map;
                }
                return null;
            }
            return null;
        }
        return null;
    }
}
